package ginv

import (
	"context"
	"net/http"
	"gorm.io/gorm"
)

// 全局配置结构体
var GlobalConfig = struct {
	DBPayAmount *gorm.DB `confx:"name=DBPayAmount"`
}{}

// 应用配置结构体
type AMSConfig struct {
	AppID  string `json:"app_id"`
	Secret string `json:"secret"`
	URL    string `json:"url"`
}

var AppConfig = struct {
	AMSConf     *AMSConfig `confx:"format=json"`
	CoreAMSConf *AMSConfig `confx:"format=json"`
}{}

// 请求结构体 - 支持多种绑定方式
type GetPartTimeListReq struct {
	Page     int32  `json:"page" form:"page" confx:"default=1"`
	PageSize int32  `json:"page_size" form:"page_size" confx:"default=10"`
	Status   string `json:"status" form:"status" confx:"format=string"`
}

// 响应结构体
type GetPartTimeListRsp struct {
	Ret  int    `json:"ret"`
	Msg  string `json:"msg"`
	Data struct {
		List  []interface{} `json:"list"`
		Total int64         `json:"total"`
	} `json:"data"`
}

// 处理函数 - 可以访问全局配置
func GetPartTimeListWithConfig(ctx context.Context, req *GetPartTimeListReq, rsp *GetPartTimeListRsp) error {
	// 可以使用全局配置
	if GlobalConfig.DBPayAmount != nil {
		// 使用数据库连接
		// db := GlobalConfig.DBPayAmount
	}
	
	// 可以使用应用配置
	if AppConfig.AMSConf != nil {
		// 使用AMS配置
		// amsURL := AppConfig.AMSConf.URL
	}

	// 设置默认值（如果BindCombo没有设置的话）
	if req.Page == 0 {
		req.Page = 1
	}
	if req.PageSize == 0 {
		req.PageSize = 10
	}

	// 模拟业务逻辑
	rsp.Data.List = []interface{}{
		map[string]interface{}{
			"id":     1,
			"title":  "兼职工作1",
			"status": req.Status,
		},
	}
	rsp.Data.Total = 1
	rsp.Ret = 0
	rsp.Msg = "请求成功"

	return nil
}

// 用户管理相关结构体
type CreateUserReq struct {
	Name     string `json:"name" form:"name" binding:"required"`
	Email    string `json:"email" form:"email" binding:"required,email"`
	Password string `json:"password" form:"password" binding:"required,min=6"`
	Role     string `json:"role" form:"role" confx:"default=user"`
}

type CreateUserRsp struct {
	Ret  int `json:"ret"`
	Msg  string `json:"msg"`
	Data struct {
		UserID int64  `json:"user_id"`
		Name   string `json:"name"`
		Email  string `json:"email"`
		Role   string `json:"role"`
	} `json:"data"`
}

func CreateUser(ctx context.Context, req *CreateUserReq, rsp *CreateUserRsp) error {
	// 模拟创建用户
	rsp.Data.UserID = 12345
	rsp.Data.Name = req.Name
	rsp.Data.Email = req.Email
	rsp.Data.Role = req.Role
	rsp.Ret = 0
	rsp.Msg = "用户创建成功"
	return nil
}

// 完整的链式启动示例，集成BindCombo
func ExampleChainWithBindCombo() {
	// 创建链式处理器，集成BindCombo配置绑定
	app := NewChainHandler().
		WithBindCombo(&GlobalConfig, &AppConfig).     // 绑定全局配置
		WithConfigFile("config.yaml").                // 设置配置文件
		BuildConfig().                                // 构建配置
		DefaultMiddlewares().                         // 添加默认中间件
		Use(RequestIDMiddleware()).                   // 添加请求ID中间件
		POST("/api/part-time/list", GetPartTimeListWithConfig). // 注册路由
		GET("/api/part-time/list", GetPartTimeListWithConfig).  // 支持GET
		POST("/api/users", CreateUser).               // 用户创建
		GET("/api/health", HealthCheck)               // 健康检查

	// 创建API版本组
	v1 := app.Group("/api/v1")
	{
		v1.POST("/part-time/list", GetPartTimeListWithConfig)
		v1.POST("/users", CreateUser)
		v1.GET("/users/:id", GetUser)
	}

	// 启动服务器
	app.Run(":8080")
}

// 健康检查处理函数
type HealthCheckReq struct{}

type HealthCheckRsp struct {
	Ret  int    `json:"ret"`
	Msg  string `json:"msg"`
	Data struct {
		Status    string `json:"status"`
		Timestamp int64  `json:"timestamp"`
	} `json:"data"`
}

func HealthCheck(ctx context.Context, req *HealthCheckReq, rsp *HealthCheckRsp) error {
	rsp.Data.Status = "ok"
	rsp.Data.Timestamp = 1640995200 // 示例时间戳
	rsp.Ret = 0
	rsp.Msg = "服务正常"
	return nil
}

// 获取用户信息
type GetUserReq struct {
	ID int64 `uri:"id" binding:"required"`
}

type GetUserRsp struct {
	Ret  int    `json:"ret"`
	Msg  string `json:"msg"`
	Data struct {
		ID    int64  `json:"id"`
		Name  string `json:"name"`
		Email string `json:"email"`
		Role  string `json:"role"`
	} `json:"data"`
}

func GetUser(ctx context.Context, req *GetUserReq, rsp *GetUserRsp) error {
	// 模拟获取用户信息
	rsp.Data.ID = req.ID
	rsp.Data.Name = "示例用户"
	rsp.Data.Email = "user@example.com"
	rsp.Data.Role = "user"
	rsp.Ret = 0
	rsp.Msg = "获取成功"
	return nil
}